import configparser
import warnings
import os

# 打印变量属性时,第一列和第二列的宽度
FIRST_WIDTH = 25
SECOND_WIDTH = 60
THIRD_WIDTH = 80


class SysHelp:
    # 显示一个对象的属性方法等
    def list_attr(obj, print_magic: bool = True, filt: str = ""):
        warnings.filterwarnings("ignore")
        print("这个对象是:\n\t%s\n有如下一些成员:" % type(obj))
        # 从dir输出的字符串中遍历所有成员
        for element in dir(obj):
            try:
                attr = getattr(obj, element)
            # 有些方法或类未实现,会弹出错误
            except NotImplementedError:
                print(
                    "\t",
                    element.ljust(FIRST_WIDTH)[:FIRST_WIDTH],
                    "\t----这个类未实现----",
                    end="\n",
                )
                continue
            # 过滤不想要的
            if len(filt) != 0 and not filt in str(type(attr)):
                continue
            # 是否打印内置参数
            if print_magic == False and element[:2] == element[-2:] == "__":
                continue
            # 打印成员名称,成员类型,成员字符化信息
            print(
                "\t",
                element.ljust(FIRST_WIDTH)[:FIRST_WIDTH],
                end="\t",
            )
            print(str(type(attr)).ljust(SECOND_WIDTH)[:SECOND_WIDTH], end="\t")
            print(str(attr).replace("\n", " ")[:THIRD_WIDTH])

    # 清空屏幕
    def clear_screen():
        # 首先，我们需要确定当前的操作系统
        if os.name == "nt":  # 如果操作系统是Windows
            os.system("cls")  # 使用'cls'命令清空屏幕
        else:  # 如果操作系统是Unix或Linux或Mac
            os.system("clear")  # 使用'clear'命令清空屏幕

    # 显示文件夹和文件夹,以供选择某一个文件
    def list_dir(path=os.getcwd(), extensions=()):
        files = os.listdir(path)
        qualified_files = []

        print(f"\n当前文件夹为:{path}\n请输入文件序号选择文件,输入 (P) 跳转到父目录，或者直接按回车结束：")

        # 如果没有指定扩展名，显示所有文件和文件夹
        if not extensions:
            for i, file in enumerate(files, 1):
                if os.path.isdir(os.path.join(path, file)):
                    print(f"{i}. <{file}>")  # 如果是文件夹，将其用 < > 围起来
                else:
                    print(f"{i}. {file}")
                qualified_files.append(file)
        else:  # 显示符合扩展名的文件，以及所有的文件夹
            index = 1  # 用于文件序号的递增
            for file in files:
                if file.endswith(extensions) or os.path.isdir(os.path.join(path, file)):
                    if os.path.isdir(os.path.join(path, file)):
                        print(f"{index}. <{file}>")  # 如果是文件夹，将其用 < > 围起来
                    else:
                        print(f"{index}. {file}")
                    qualified_files.append(file)
                    index += 1

        choice = input()

        if choice.lower() == "p":
            # 跳转到父目录
            parent_path = os.path.dirname(path)
            print(f"\n当前路径:{parent_path}\n")
            return SysHelp.list_dir(parent_path, extensions)
        elif choice == "":
            return ""
        else:
            selected_path = os.path.join(
                path, qualified_files[int(choice) - 1]
            )  # 得到所选文件或文件夹的完整路径
            if os.path.isdir(selected_path):
                # 如果选择的是一个目录，继续列出该目录下的文件
                return SysHelp.list_dir(selected_path, extensions)
            else:
                # 如果选择的是一个文件，返回该文件的完整路径
                return selected_path

    # 打印列表以供选择, 第一项为 1, 没有选择返回 0
    def select(lst):
        for i, l in enumerate(lst, start=1):
            print(f"{i}. {l}")

        while True:
            try:
                choice = input("请输入数字选择对应的 list(不选择就直接回车):")
                if choice == "":
                    return 0
                choice = int(choice)

                if choice <= 0 or choice > len(lst):
                    print("输入( 数字 )不正确，请重新选择")
                else:
                    return choice

            except ValueError:
                print("输入不正确，请重新选择")

    def self_dir():
        return os.path.dirname(os.path.abspath(__file__))
